package com.beiding.t;

import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import com.beiding.jsonanalyzer.Analyzer;
import org.springframework.http.HttpEntity;
import org.springframework.http.HttpHeaders;
import org.springframework.web.client.RestTemplate;

import java.io.*;
import java.util.Arrays;
import java.util.Iterator;
import java.util.List;
import java.util.concurrent.CopyOnWriteArrayList;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.ThreadPoolExecutor;
import java.util.concurrent.atomic.AtomicBoolean;
import java.util.concurrent.atomic.AtomicLong;
import java.util.concurrent.atomic.AtomicReference;

/**
 * @author 丁常磊
 * @date 2021/12/16 21:39
 */

public class 问题订单处理JSON {

//    public static void main(String[] args) throws IOException {
//
//        Analyzer load = Analyzer.load(new File("C:\\Users\\lenovo\\Desktop\\重算订单\\老银座到家问题订单.json"));
//
//        JSONArray jsonArray = load.getJsonArray("data.report");
//
//
//        //线程安全
//        List<String> hs = new CopyOnWriteArrayList<>(Arrays.asList());
//
//
//        handlePass(hs);
//
//        ExecutorService executorService = Executors.newSingleThreadExecutor();
//        ExecutorService te = Executors.newFixedThreadPool(1);
//
//
//        FileWriter fieldWriter = new FileWriter(new File("C:\\Users\\lenovo\\Desktop\\重算订单\\处理日志\\t" + System.currentTimeMillis() + ".txt"));
//
//        Iterator<Object> iterator = jsonArray.iterator();
//
//        while (true) {
//
//            if (!iterator.hasNext()) {
//                return;
//            }
//            JSONObject next = (JSONObject) iterator.next();
//
//            te.submit(() -> {
//
//                String id = next.getString("billno");
//
//
//                System.out.println(id);
//                String rid = id;
//                System.out.println(rid);
//
//                if (hs.contains(rid)) {
//                    System.out.println("执行过跳过  " + rid);
//                    return;
//                }
//
//                //执行计算
//
//                System.out.println("开始执行计算" + rid);
//
//                StringBuilder rb = new StringBuilder();
//
//                //记录id
//                rb.append("#OID:  ").append(rid);
//
//                //发起调用
//
//                Analyzer analyzer = Analyzer.read("{\n" +
//                        "    \"bill_detail\":{\n" +
//                        "        \"billno\":\"\"\n" +
//                        "    }\n" +
//                        "}");
//
//                analyzer.set("bill_detail.billno", rid);
//
//                String request = request("http://10.0.84.27/omp-event-webin/rest?method=efuture.omp.event.coupongain.recalc&ent_id=0&rootkey=1638857099907", analyzer);
//                System.out.println("调用结果");
//                System.out.println(request);
//
//                executorService.submit(() -> {
//                    rb.append("\n#RST  ").append(request).append("\n\n");
//                    System.out.println("写入任务       " + rb.toString());
//                    try {
//
//                        fieldWriter.write(rb.toString());
//                        fieldWriter.flush();
//                    } catch (Exception e) {
//                        System.out.println("写入失败");
//                        System.out.println(rb);
//                        e.printStackTrace();
//                    }
//
//                });
//
//
//                hs.addElement(rid);
//            });
//
//        }
//
//    }
//
//    private static void handlePass(List<String> list) throws IOException {
//        File[] files = new File("C:\\Users\\lenovo\\Desktop\\重算订单\\处理日志").listFiles();
//
//        if (files != null) {
//            for (File file : files) {
//                BufferedReader reader = new BufferedReader(new FileReader(file));
//
//                while (true) {
//                    String s = reader.readLine();
//                    if (s == null) {
//                        break;
//                    }
//                    if (s.startsWith("#RST  ")) {
//                        String substring = s.substring("#RST  ".length());
//                        int index = substring.indexOf("订单已计算返利,不能重复计算");
//
//                        if (index != -1) {
//
//                            int sf = -1;
//                            int st = -1;
//                            for (int i = index; i >= 0; i--) {
////                                System.out.println(substring.charAt(i));
//                                if (']' == substring.charAt(i)) {
//                                    if (st == -1) {
//                                        st = i;
//                                    }
//                                } else if ('[' == substring.charAt(i)) {
//                                    if (sf == -1) {
//                                        sf = i;
//                                    }
//                                }
//                            }
//
//                            String id = substring.substring(sf + 1, st);
//
////                            System.out.println(id);
//
//                            list.addElement(id);
//
//                        }
//
//
//                    }
//
//                }
//            }
//        }
//
//
//    }
//
//    private static String request(String path, Analyzer body) {
//        RestTemplate restTemplate = new RestTemplate();
//        HttpHeaders httpHeaders = new HttpHeaders();
//        HttpEntity<String> entity = new HttpEntity<>(body.getContent(JSON.class).toJSONString(), httpHeaders);
//        return restTemplate.postForObject(path, entity, String.class);
//    }
//
//
//    /**
//     * 号码段对象
//     */
//    public class Segment {
//        /**
//         * 从哪个号码开始
//         */
//        private long from;
//
//        /**
//         * 号码段长度
//         */
//        private int size;
//
//        /**
//         * 到哪个号码结束
//         */
//        private long to;
//
//        /**
//         * 需要加载下一个号码段的数量
//         */
//        private long numberToLoad;
//
//        /**
//         * id计数器,从from开始
//         */
//        private AtomicLong count;
//
//        public long getNumberToLoad() {
//            return numberToLoad;
//        }
//
//        public void setNumberToLoad(long numberToLoad) {
//            this.numberToLoad = numberToLoad;
//        }
//
//        public AtomicLong getCount() {
//            return count;
//        }
//
//        public void setCount(AtomicLong count) {
//            this.count = count;
//        }
//
//        public long getFrom() {
//            return from;
//        }
//
//        public void setFrom(long from) {
//            this.from = from;
//        }
//
//        public int getSize() {
//            return size;
//        }
//
//        public void setSize(int size) {
//            this.size = size;
//        }
//
//        public long getTo() {
//            return to;
//        }
//
//        public void setTo(long to) {
//            this.to = to;
//        }
//    }
//
//
//    public class IdFactory {
//
//        /**
//         * 最多的号码段数量
//         */
//        private int maxSegmentNumber = 3;
//
//        /**
//         * 最小的号码段数量
//         */
//        private int minSegmentNumber = 1;
//
//        /**
//         * 每个号码段的大小
//         */
//        private int segmentSize = 100;
//
//        /**
//         * 当前的号码段
//         */
//        private AtomicReference<Segment> current = new AtomicReference<>();
//
//        /**
//         * 所有就绪的号码段
//         */
//        private AtomicReference<Segment> readySegment = new AtomicReference<>();
//
//        /**
//         * 加载锁
//         */
//        private final Object loadLock = new Object();
//
//        /**
//         * 单线程执行者
//         */
//        private ExecutorService executorService = Executors.newSingleThreadExecutor();
//
//        private AtomicBoolean loading = new AtomicBoolean();
//
//        /**
//         * 创建一个ID
//         *
//         * @return
//         */
//        public long createId() {
//            while (true) {
//                Segment segment = current.get();
//                if (segment == null) {
//                    //切换为下一个号码段
//                    swatchNext();
//                } else {
//                    long l = segment.getCount().incrementAndGet();
//                    //如果大于最大值 表示该号码段已经用尽
//                    if (l > segment.getTo()) {
//                        //将当前位置移除
//                        current.compareAndSet(segment, null);
//                    } else {
//                        //如果合法,正常返回
//                        if (l >= segment.getNumberToLoad()) {
//                            if (loading.compareAndSet(false, true)) {
//                                //提交任务
//                            }
//                        }
//                        return l;
//                    }
//                }
//            }
//        }
//
//        /**
//         * 切换到下一个就绪的号码段
//         */
//        private void swatchNext() {
//            Segment next = readySegment.get();
//            //进行一次处理
//            if (next != null) {
//                current.compareAndSet(null, next);
//            }else{
//                synchronized (loadLock) {
//                    //如果当前非空,不再处理
//                    if (current.get() == null) {
//                        if (readySegment.get() == null) {
//                            doLoad();
//                        }
//                    }
//                }
//            }
//        }
//
//
//        private void doLoad() {
//
//        }
//
//
//    }

}
